Sử dụng AWS S3 để lưu trữ file trong Laravel
Bài đăng này đã không được cập nhật trong 5 năm
Giới thiệu
Một website dạng bình thường không cần lưu trữ quá nhiều hình ảnh, video hay các tệp tin khác thì bạn có thể lưu trữ luôn ngay trên hosting, server của mình. Nhưng một số website đặc thù cần lưu trữ một lượng lớn tệp tin mà hosting, server không đáp ứng được thì bắt buộc phải sử dụng dịch vụ bên thứ 3 để lưu trữ.
Amazon S3 (Simple Storage Service) là một dịch vụ tuyệt vời để lưu trữ tệp tin phổ biến nhất trong công nghệ điện toán đám may hiện nay, nó lưu trữ tệp tin như một object trong các bucket
Bài viết này, mình xin giới thiệu với các bạn cách sử dụng AWS S3 để lưu trữ file trong các dự án Laravel
Cấu hình AWS S3
Tạo tài khoản riêng cho S3
Để quản lý S3, ta nên tạo một tài khoản riêng chỉ để quản lý S3 để dễ dàng quản lý hơn
Đăng nhập vào AWS Console bằng tài khoản tạo bằng Gmail. Sau đó chọn My Security Credentials
Màn hình AIM hiện ra, click tạo User. Điền tên tài khoản sẽ quản lý S3 như hình
PS: Chọn programe thì chỉ tạo ra access_key để truy cập S3
Chọn dòng tiếp theo sẽ tạo mật khẩu để đăng nhập vào Console
Sau đó click Next, hiện ra màn hình set quyền chọn S3FullAccess
Sau đó click Next 2 lần là đã tạo tài khoản thành công
Các thông tin được tạo ra gồm có
- Đường dẫn dạng
Account ID.signin.aws.amazon.com
- Account và Password để đăng nhập AWS S3
- AWS_ACCESS_KEY_ID:
- AWS_SECRET_ACCESS_KEY:
Tạo bucket
Đăng nhập vào AWS S3 bằng tài khoản đã tạo
Các bạn vào trang https://aws.amazon.com/s3/ để đăng ký tài khoản
Sau đó vào https://console.aws.amazon.com/console tìm và chọn S3
Chọn create bucket
Chọn next, có một số dịch vụ bạn có thể chọn enable nó lên, không thì bỏ qua và tiếp tục bấm next
Để mặc định và tiếp tục bấm next, nó sẽ tự tạo bucket cho mình
Sau đó, chọn vào quản lý bucket vừa tạo để set quyền truy cập vào file sẽ xử lý
Access for bucket owner: List objects, Write objects, Read bucket permissions
Public access Everyone: List objects
Sử dụng S3 để lưu trữ file trong Laravel
Thiết lập file .env
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=
AWS_URL=
FILESYSTEM_DRIVER=s3
Thiết lập filesystems.php
'cloud' => env('FILESYSTEM_CLOUD', 's3'),
'disks' => [
...
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => 'us-east-1',
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
],
],
Cài thư viện
Như trên docs của laravel có ghi là để sử dụng S3 driver bạn sẽ phải cài thư viện league/flysystem-aws-s3-v3
Mở terminal lên và chạy
composer require league/flysystem-aws-s3-v3
Các thao tác sử dụng
Mình đã tạo một project để demo. Các bạn có thể tham khảo mã nguồn Tại đây
Thao tác upload file lên S3
public function postUpload(StoreImage $request)
{
$path = Storage::disk('s3')->put('images/originals', $request->file, 'public');
$request->merge([
'size' => $request->file->getClientSize(),
'path' => $path
]);
$this->image->create($request->only('path', 'title', 'size'));
return back()->with('success', 'Image Successfully Saved');
}
Hiển thị file ra view
<th><img width="100px" src="{{$image->url}}"></th>
Thao tác xóa file trên S3
public function destroy(Image $image)
{
$path = $image->path;
$image->delete();
Storage::disk('s3')->delete($image->path);
return back()->with('success', 'Image Successfully Saved');
}
Tài liệu tham khảo
Dùng Amazon S3 để lưu trữ file trong Laravel
Giới thiệu về filesystem storage trong Laravel
Laravel: Upload file to AWS S3 in 20 minutes challenge
All rights reserved